package com.nuoniu.sibanyun.service.production;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.entity.bo.VProductionWorkDetailCumBo;
import com.nuoniu.sibanyun.entity.dto.ProductionWorkSearchDto;
import com.nuoniu.sibanyun.entity.dto.VProductionWorkMainSearchDto;
import com.nuoniu.sibanyun.entity.dto.VProductionWorkMainSplitDto;
import com.nuoniu.sibanyun.entity.dto.statistics.ProductionWorkCumSummaryDto;
import com.nuoniu.sibanyun.entity.dto.statistics.ProductionWorkInAndPickDto;
import com.nuoniu.sibanyun.entity.dto.statistics.ProductionWorkMonthSummaryDto;
import com.nuoniu.sibanyun.entity.production.VProductionWorkMain;
import com.nuoniu.sibanyun.entity.vo.UnFinishProductionShowVo;
import com.nuoniu.sibanyun.entity.vo.reportVo.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 生产加工单 服务类
 * </p>
 *
 * @author 小啊刚
 * @since 2021-03-13
 */
public interface IVProductionWorkMainService extends IService<VProductionWorkMain> {


    /**
     * 获取单据编码
     * @author 小啊刚
     * @date 2021-03-13
     */
    String getCode();

    /**
     * 保存加工单（20210710 白强）
     * @param productionWorkMain
     */
    void saveProductionWorkMain(VProductionWorkMain productionWorkMain);


    /**
     * 保存单据（根据产品切分单据）
     * @param productionWorkMainSplitDto
     */
    void saveOrderForInventory(VProductionWorkMainSplitDto productionWorkMainSplitDto);

    /**
     * 删除单据
     * @author 小啊刚
     * @date 2021-03-20
     */
    void deleteById(Long id);

    /**
     * @title 提交 单据
     * @description
     * @author 白强
     * @updateTime 2021/12/14 10:12
     * @throws
     */
    void submit(Long id, Integer status);

    /**
     * 审核
     * @param id
     * @param status
     */
    void examine(Long id,Integer status);

    /**
     * 获取 累计执行数量
     * @param id
     * @return
     */
    BigDecimal getCumExecuteQuantity(Long id);

    /**
     * 获取某个加工单（所有产品明细的）累计派遣数量
     * @param id
     * @return
     */
    BigDecimal getAllDetailCumDispatchQuantity(Long id);



    /**
     * 查询 未完工 的加工单
     * @param productionWorkMainSearchDto
     * @return
     */
    List<VProductionWorkMain> listNotFinishMain(VProductionWorkMainSearchDto productionWorkMainSearchDto);

    /**
     * 查询 未完工 的加工单
     * @param productionWorkMainSearchDto
     * @return
     */
    List<VProductionWorkMain> listNotFinishMain2(VProductionWorkMainSearchDto productionWorkMainSearchDto);

    /**
     * 更新 加工单单据状态
     * @param id
     * @param voucherState
     */
    void updateVoucherState(Long id,Integer voucherState);




    /**************** 委外加工  **********************/


    /**
     * 获取委外加工单 单据编码
     */
    String getDelegateCode();

    /**
     * 删除 委外加工单
     */
    void deleteDelegateById(Long id);

    /**
     * 审核 委外加工单
     */
    void examineDelegate(Long id,Integer status);

    /**
     * 查询 未完工 的加工单 明细 和 材料明细
     * @param delegateProductionWorkSearchDto
     * @return
     */
    UnFinishProductionShowVo listUnFinishProductionShowVo(ProductionWorkSearchDto delegateProductionWorkSearchDto);

    /**
     * 更新 加工单材料明细 执行情况
     * @param productionWorkDetailCumBoList
     */
    void calculateCumQuantity(List<VProductionWorkDetailCumBo> productionWorkDetailCumBoList);


    /*********************   生产制造 报表统计  **********************/
    /**
     * 生产订单执行汇总表
     * @param dto
     * @return
     */
    Page<ProductionWorkCumSummaryVo> pageProductionWorkCumSummaryVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产订单执行明细表
     * @param dto
     * @return
     */
    Page<ProductionWorkCumDetailVo> pageProductionWorkCumDetailVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产订单领料汇总表
     * @param dto
     * @return
     */
    Page<ProductionPickReturnCumSummaryVo> pageProductionPickReturnCumSummaryVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产订单领料明细表
     * @param dto
     * @return
     */
    Page<ProductionPickReturnCumDetailVo> pageProductionPickReturnCumDetailVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产领料异常表
     * @param dto
     * @return
     */
    Page<ProductionPickAbnormalVo> pageProductionPickAbnormalVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产领料差异汇总表
     * @param dto
     * @return
     */
    Page<ProductionPickAbnormalVo> pageProductionPickAbnormalSumVo(ProductionWorkCumSummaryDto dto);

    /**
     * 生产入库月报表
     * @param dto
     * @return
     */
    Page<ProductionMonthInVo> pageProductionMonthInVo(ProductionWorkMonthSummaryDto dto);

    /**
     * 生产领料月报表
     * @param dto
     * @return
     */
    Page<ProductionPickReturnMonthSummaryVo> pageProductionPickReturnMonthSummaryVo(ProductionWorkMonthSummaryDto dto);


    /**
     * 生产入库领料查询 -- 产品入库情况
     * @param dto
     * @return
     */
    Page<ProductionInMainVo> pageProductionInMainVo( ProductionWorkInAndPickDto dto);

    /**
     * 生产入库领料查询 -- 对应产品领料情况
     * @param dto
     * @return
     */
    List<ProductionPickVo> listProductionPickVo(ProductionWorkInAndPickDto dto);


}
